package com.azt.api.service;

import java.util.List;
import java.util.Map;

import com.azt.api.dto.HandleCoinDto;
import com.azt.api.pojo.CoinRecord;
import com.azt.api.pojo.CoinRule;
import com.azt.exception.BaseException;
import com.azt.model.page.Pagination;

public interface CoinService {
    List<CoinRecord> findCoinRecord(int companyId);

    public Pagination coinManagerList(int pageno, int pagesize, Map<String, String> params);
	
	public Pagination coinRecordList(int pageno, int pagesize,Map<String, String> params);
	/**
	 * 获取企业可用和已使用安装币
	 * @Title: useAnNouseCoin 
	 * @Description: TODO
	 * @param companyId
	 * @return
	 * @return: Map<String,String>
	 * @author: zhoudongdong 2017年2月28日 上午10:18:52
	 */
	public Map<String, String> useAnNouseCoin(String companyId);
	
	public Pagination coinRuleList(int pageno, int pagesize,Map<String, String> params);
	
	public void saveCoinRule(CoinRule coinRule);
	
	public void removeCoinRule(Integer id);

	/**
	 * 安装币操作接口，可加 ，可减
	 *
	 * @param hcd 操作安装币所需字段记录
	 */
	public void handleCoin(HandleCoinDto hcd);

	/**
	 * 根据安装币规则来赠送/抵扣安装币(按照数量)
	 * @param ruleCode 安装币规则code
	 * @param companyId 公司id
	 * @param operateId 运营后台管理员id
	 * */
	void addCompanyCoin(String ruleCode, int companyId, Double money, String descr, Integer operateId);

    /**
	 * 根据企业id获取企业可用的安装币
	 * @param companyId
	 * @return >=0 的安装币
	 */
	public int getCoinByCompanyId(int companyId);

    /**
     * 根据ruleCode 获取有效的rule
     * @param ruleCode
     * @return CoinRule实例或null
     */
    public CoinRule getEffectiveRule(String ruleCode);

	/**
	 * 根据规则获取可操作的安装币
	 * @param tranAmount 订单金额   若是按比例赠送的安装币  需要此字段  若是按数量赠送  此字段可传入null
	 * @param ruleCode 安装币规则code 应唯一
	 * @param companyId 被操作公司Id
	 * @return >= 0 没有可操作的安装币时 返回0
	 */
	public int getCanHandleCoin(Double tranAmount , String ruleCode , int companyId);


	public CoinRule selectRuleBycode(String code);
	
	/**
	 * 后台管理员手动扣除安装币
	 * @Title: adminChangeCoin 
	 * @Description: TODO
	 * @param coinrecord
	 * @return: void
	 * @author: zhoudongdong 2017年2月28日 下午2:09:53
	 */
	public void adminChangeCoin(CoinRecord coinrecord);
    
	
    /** 
     * 获取有效的安装币规则集合
     * @Title: getCoinList 
     * @Description: TODO
     * @param operateType
     * @return
     * @return: List<CoinRule>
     * @author: 叶青 2017年3月1日 下午2:09:41 
     */
    public List<CoinRule> findValidCoinRule();

	/**
	 * 获取安装币记录  union 支付抵扣冻结的记录
	 * @param companyId
	 * @return
	 */
	public List<Map<String, Object>> getCoinRecord(Integer companyId);

}
